package cbm.seguridad.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import cbm.commons.BaseController;
import cbm.commons.ConstantsWeb;
import cbm.commons.RequestHelper;
import cbm.commons.ResultadoOperacionBean;
import cbm.commons.SessionContainer;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.OpcionBean;
import ejb.cbm.seguridad.bean.PerfilBean;
import ejb.cbm.seguridad.bean.RegistroIngresoBean;
import ejb.cbm.seguridad.bean.RegistroPerfilBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.local.PerfilFacadeLocal;

public class PerfilController extends BaseController{
	
	@Autowired
	public PerfilFacadeLocal perfilFacadeLocal;

	public ModelAndView open(HttpServletRequest request, HttpServletResponse response){
		String pagSig = resources.getString("gestionar_perfiles");
		return new ModelAndView(pagSig);
	}

	//gclv 12/09/2011
	public ModelAndView save(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String paginaSig = resources.getString("ajaxrequest");
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		//Context context = null;
		PerfilBean perfilBean = null;
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		String tituloPopUp = "";
		try{
			perfilBean = getPerfilBean(request);

			//context = new InitialContext();
			//perfilFacadeLocal=(PerfilFacadeLocal)context.lookup("CBM/PerfilFacade/local");
			try{
				perfilFacadeLocal.save(perfilBean,usuarioLogeado);
			}
				catch (Exception e) {
					logger.error(e);
					resultado.setResultado(ConstantsWeb.ERROR);
					resultado.setTitulo("Error al grabar");
					resultado.setMensaje("El perfil se encuentra registrado");
					
				}
		}
		catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al grabar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al grabar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		sessionContainer.addTemporal(ConstantsWeb.PERFIL, perfilBean);
		sessionContainer.addTemporal(ConstantsWeb.TITULOPOPUP, tituloPopUp);
		
		return new ModelAndView(paginaSig,"responseText",resultado.getAsArrayJS());
	}
	
	//gclv 12/09/2011
	public PerfilBean getPerfilBean(HttpServletRequest request) {
		PerfilBean perfilBean = null;
		try {
			Long codigoPerfil = RequestHelper.getParameterLong(request, "txtCodigoPerfil");
			String descripcionPerfil = RequestHelper.getParameterString(request, "txtDescripcionPerfil");
			Long tipoPerfil = RequestHelper.getParameterLong(request, "selTipoPerfil");			
			Long estado = RequestHelper.getParameterLong(request, "selEstado");
			Long permisoExtorno = RequestHelper.getParameterLong(request, "selExtorno");
			
			perfilBean = new PerfilBean();
			perfilBean.setCodigoperfil(codigoPerfil);
			perfilBean.setDescripcionperfil(descripcionPerfil);
			perfilBean.setTipoperfil(tipoPerfil);
			perfilBean.setFlagactivo(estado);
			perfilBean.setFlagextorno(permisoExtorno);
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		}
		return perfilBean;
	}

	//gclv 12/09/2011
	public ModelAndView eliminar(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String paginaSig = "seguridad/PerfilesTabla.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		RegistroIngresoBean registroIngreso = (RegistroIngresoBean)sessionContainer.getSessionElement(ConstantsWeb.REGISTRO_INGRESO);
		//Context context = null;
		PerfilBean perfilBean = null;
		//UsuarioBean usuarioBean = null;
		List<PerfilBean> lista = null;
		
		try{
			Long codigoPerfil = RequestHelper.getParameterLong(request, "hidCodigoPerfil");
			perfilBean = new PerfilBean();
			perfilBean.setCodigoperfil(codigoPerfil);
			perfilBean.setFechamodificacion(new Date(System.currentTimeMillis()));
			perfilBean.setUsuariomodificacion(registroIngreso.getCodigousuario());
			perfilBean.setFlagactivo(new Long(0));
			
			//context = new InitialContext();
			//perfilFacadeLocal =(PerfilFacadeLocal)context.lookup("CBM/PerfilFacade/local");
			perfilFacadeLocal.save(perfilBean, usuarioLogeado);
			
			perfilBean = getPerfilBean(request);
			//context = new InitialContext();
			lista = perfilFacadeLocal.buscar(perfilBean);
			if (lista.size() == 0) lista=null;
		}catch(RuntimeException e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}/*catch (SQLException e) {
			resultado.setResultado(Constants.ERROR);
			resultado.setTitulo("Error al buscar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}*/
		sessionContainer.addTemporal(ConstantsWeb.GRILLA, lista);
		return new ModelAndView(paginaSig);
	}
	
	//gclv 12/09/2011
	public ModelAndView openMantenimiento(HttpServletRequest request, HttpServletResponse response){
		String pagSig = "seguridad/PerfilMnt.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		HttpSession session = request.getSession(false);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		//Context context = null;
		PerfilBean perfilBean = null;
		String tituloPopUp = "Nuevo Perfil";
		
		try{
			Long codigoPerfil = RequestHelper.getParameterLong(request,"codigoPerfil");
		    perfilBean = new PerfilBean();
			
			//context = new InitialContext();
			
			//perfilFacadeLocal=(PerfilFacadeLocal)context.lookup("CBM/PerfilFacade/local");
			if (codigoPerfil != null && !codigoPerfil.toString().trim().equals("")){
				perfilBean = perfilFacadeLocal.buscar(codigoPerfil);
				tituloPopUp = "Modificar Perfil";
			}

		}catch(RuntimeException e){
			e.printStackTrace();logger.error(e);
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
			e.printStackTrace();logger.error(e);
		}
		sessionContainer.addTemporal(ConstantsWeb.PERFIL, perfilBean);
		sessionContainer.addTemporal(ConstantsWeb.TITULOPOPUP, tituloPopUp);
		
		return new ModelAndView(pagSig);
	}
	
	public ModelAndView buscar(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String paginaSig = "seguridad/PerfilesTabla.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		List<PerfilBean> listResultado = null;
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		//RegistroIngresoBean registroIngreso = (RegistroIngresoBean)sessionContainer.getSessionElement(Constants.REGISTRO_INGRESO);
		PerfilBean filtro = new PerfilBean();
		//Context context = null;
		
		try{
			
			filtro = this.getFormularioAsBean(request);
			//context = new InitialContext();
			//perfilFacadeLocal =(PerfilFacadeLocal)context.lookup("CBM/PerfilFacade/local");

			listResultado = perfilFacadeLocal.buscar(filtro);
			
			if(listResultado.size()==0)listResultado = null;

		}catch(RuntimeException e){
			e.printStackTrace();logger.error(e);
			paginaSig = resources.getString("pagina_error");
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
			paginaSig = resources.getString("pagina_error");
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		
		sessionContainer.addTemporal(ConstantsWeb.GRILLA, listResultado);
		return new ModelAndView(paginaSig);
	}

	//gclv 13/09/2011
	public ModelAndView openPerfilOpcion(HttpServletRequest request, HttpServletResponse response){
		String pagSig = "seguridad/GestionarOpciones.jsp";
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		HttpSession session = request.getSession(false);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		//Context context = null;
		String tituloPopUp = "Gestionar Opciones";
		List<OpcionBean> opcionesdisponibles = null;
		PerfilBean perfil = null;
		
		try{
			Long codigoPerfil = RequestHelper.getParameterLong(request,"codigoPerfil");
//		    perfilBean = new PerfilBean();
			//context = new InitialContext();
			
			//perfilFacadeLocal=(PerfilFacadeLocal)context.lookup("CBM/PerfilFacade/local");
			
			if (codigoPerfil != null ){
				perfil = perfilFacadeLocal.buscar(codigoPerfil);
				opcionesdisponibles = perfilFacadeLocal.obtenerOpcionesNoAsignadas(codigoPerfil);
			}

		}catch(RuntimeException e){
			e.printStackTrace();logger.error(e);
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al eliminar");
			resultado.setMensaje("NamingException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
			e.printStackTrace();logger.error(e);
		}
		
		sessionContainer.addTemporal(ConstantsWeb.PERFIL, perfil);
		sessionContainer.addTemporal(ConstantsWeb.OPCIONES_DISPONIBLES, opcionesdisponibles); //gclv 14/09/2011
		sessionContainer.addTemporal(ConstantsWeb.TITULOPOPUP, tituloPopUp);
		
		return new ModelAndView(pagSig);
	}
	
	private PerfilBean getFormularioAsBean(HttpServletRequest request) {
		
		PerfilBean datosFormulario = new PerfilBean();
		
		Long codigoPerfil = RequestHelper.getParameterLong(request, "txtCodigoPerfil");
		String descripcionPerfil = RequestHelper.getParameterString(request, "txtDescripcionPerfil");
		Long estado = RequestHelper.getParameterLong(request, "selEstado");
		Long tipoPerfil = RequestHelper.getParameterLong(request, "selTipoPerfil");

		
		datosFormulario.setCodigoperfil(codigoPerfil);
		datosFormulario.setDescripcionperfil(descripcionPerfil);
		datosFormulario.setFlagactivo(estado);
		datosFormulario.setTipoperfil(tipoPerfil);
		
		return datosFormulario;

	}	
	
	//gclv 16/09/2011 metodo que graba las opciones seleccionadas
	public ModelAndView saveOpciones(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession(false);
		String paginaSig = resources.getString("ajaxrequest");
		ResultadoOperacionBean resultado = new ResultadoOperacionBean(ConstantsWeb.EXITO,"",ConstantsWeb.MSGEXITO);
		SessionContainer sessionContainer = (SessionContainer)session.getAttribute(ConstantsWeb.SESSION_CONTAINER);
		//Context context = null;
		PerfilBean perfilBean = null;
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		String tituloPopUp = "";
		try{
			perfilBean = getPerfilBean_PruebaOpciones(request);

			perfilFacadeLocal.save(perfilBean,usuarioLogeado);
		} catch(Exception e) {
			e.printStackTrace();logger.error(e);
			resultado.setResultado(ConstantsWeb.ERROR);
			resultado.setTitulo("Error al grabar");
			resultado.setMensaje("RuntimeException");
			resultado.setTrace(StackTrace2String.stackTraceToString(e));
		}
		
		sessionContainer.addTemporal(ConstantsWeb.RESULTADO_OPERACION, resultado);
		sessionContainer.addTemporal(ConstantsWeb.PERFILES, perfilBean);
		sessionContainer.addTemporal(ConstantsWeb.TITULOPOPUP, tituloPopUp);
		
		return new ModelAndView(paginaSig,"responseText",resultado.getAsArrayJS());
	}
	
	//gclv 16/09/2011 con este metodo se obtiene una lista de opciones que contiene a las seleccionadas en el form
	public PerfilBean getPerfilBean_PruebaOpciones(HttpServletRequest request) {
		PerfilBean perfilBean = new PerfilBean();
		List<String> opciones = null;
		OpcionBean opcionBean = new OpcionBean();
		List<OpcionBean> listOpcionBean = new ArrayList<OpcionBean>();
		//Context context = null;
		try {
			//context = new InitialContext();
			//perfilFacadeLocal =(PerfilFacadeLocal)context.lookup("CBM/PerfilFacade/local");
			
			Long codigoPerfil = RequestHelper.getParameterLong(request, "txtCodigoPerfil");
			String seleccion = RequestHelper.getParameterString(request, "hidOpcSeleccionadas");
			if(seleccion != null){
				opciones = Arrays.asList(seleccion.split(","));
				logger.info("opciones.size()"+opciones.size());
				for(int i=0; i<opciones.size(); i++){
					Long opcionCodigo = Long.parseLong(opciones.get(i).toString());
					opcionBean = perfilFacadeLocal.buscarOpcion(opcionCodigo);
					listOpcionBean.add(opcionBean);
				}
			}
			perfilBean = new PerfilBean();
			perfilBean.setCodigoperfil(codigoPerfil);
			perfilBean.setOpciones(listOpcionBean);
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		}
		return perfilBean;
	}
	
	public ModelAndView verificarPerfil(HttpServletRequest request, HttpServletResponse response){
		String paginaSig    = resources.getString("ajaxrequest");
		List<PerfilBean> listResultado = null;
		PerfilBean filtro = new PerfilBean();
		String respuesta = "0";
		try{
			filtro = this.getFormularioAsBean(request);
			listResultado = perfilFacadeLocal.buscar(filtro);
			
			if(listResultado.size()>0){
				respuesta = "1";
			}

		}catch(RuntimeException e){
			e.printStackTrace();logger.error(e);
			respuesta = "-1";
		}catch(Exception e){
			e.printStackTrace();logger.error(e);
			respuesta = "-1";
		}
		
		return new ModelAndView(paginaSig,"responseText",respuesta);
		
	}
}